//
//  HYLNetworkTool.swift
//  iOSwechat
//
//  Created by apple on 16/2/27.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit
import AFNetworking

// 枚举是值类型
// 类是：指针
enum HYLNetworkToolError: Int {
    // 方式2
    case AccessTokenEmpty = -1
    case UidEmpty = -2
    
    // 方式2:
    // 枚举可以有属性
    var errorMessage: String {
        get {
            switch self {
            case AccessTokenEmpty: return "access_token 没有值"
            case UidEmpty: return "Uid 没有值"
            }
        }
    }
    
    // 方式3: 将NSError的创建也封装到枚举里面
    // 枚举可以有方法
    func error() -> NSError {
        return NSError(domain: "cn.itcast.net", code: self.rawValue, userInfo: ["errorMessage" : self.errorMessage])
    }
}

class HYLNetworkTool: NSObject {

    // 单例构造方法
    static var sharedInstance : HYLNetworkTool = HYLNetworkTool()
    
    let afnManager: AFHTTPSessionManager
    
    // 将唯一的构造方法私有化,外部无法通过构造函数来初始化对象了
     private override init() {
        let baseURL = NSURL(string: "https://api.weibo.com")
        afnManager = AFHTTPSessionManager(baseURL: baseURL)
        
        // 配置类型
        afnManager.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        super.init()
    }
    
 
    
    let client_id = "79918652"
    let redirect_uri = "http://www.baidu.com"
    let client_secret = "95ded1ecf3af382ce42941a299d083e3"
    let oauthUrl = "https://api.weibo.com/oauth2/authorize"
    let response_type = "code"
    
    // MARK: - 获取oauth授权的加载登录界面登录界面地址
    func oauthLoginUrl() -> NSURL {
        let oauthLoginUrl = "https://api.weibo.com/oauth2/authorize?client_id=79918652&redirect_uri=http://www.baidu.com&response_type=code"
        print("\(oauthLoginUrl)")
        return NSURL(string: oauthLoginUrl)!
    }
    
    // 3.2添加loadAccessToken 方法
    func loadAccessToken(code:String,accessTokenFinished: finishedCallBack){
        //  3.3 api地址
        let urlString = "https://api.weibo.com/oauth2/access_token"

        // 3.4 post 参数
        let paremeters = [
            "client_id" : client_id,
            "client_secret" : client_secret,
            "grant_type" : "authorization_code",
            "code" : code,
            "redirect_uri" : redirect_uri
        ]
        
        // 3.5 发送POST请求
        afnManager.POST(urlString, parameters: paremeters, success: { (_, response) -> Void in
            // 网络工具类只负责加载数据，不负责出来数据
//                print("------获取Access Toke 请求成功: \(response)")
                // response as! [String:AnyObject] // ！表示一定强制转成字典，不成功，程序崩溃
            // response as？ [String:AnyObject] // ！表示可能强制转成字典，不成功，nil
            // 3.6 获取到数据，调用闭包 
            let dict = response as? [String:AnyObject]
            accessTokenFinished(rusult: dict, error: nil)
            }) { (_, error) -> Void in
                
                // print("获取Access Toke 请求失败: \(error)")
                accessTokenFinished(rusult: nil, error: error)
        }
    }
    
    
    // 访问用户信息
    func loadUserInfo(finished: (result : [String : AnyObject]?,error: NSError?) -> ()) {
        
        
        // 3.判断access_token
        // 守卫 access_token 可以在后面的代码直接使用,不要放到代码块里面,减少嵌套
        // 测试错误
//        HYLUserAccountViewModel.sharedInstance.userAccout?.access_token = nil
//        guard let access_token = HYLUserAccountViewModel.sharedInstance.userAccout?.access_token else {
//          
//            let error = HYLNetworkToolError.AccessTokenEmpty.error()
//            
//            finished(result: nil, error: error)
//            return
//        }
        
        // 4.判断uid
        // 测试Uid为空
        // HYLUserAccountViewModel.sharedInstance.userAccout?.uid = nil
        guard let uid = HYLUserAccountViewModel.sharedInstance.userAccout?.uid else {
        
            // print("uid 没有值")
            
            let error = HYLNetworkToolError.UidEmpty.error()
                finished(result: nil, error: error)
            return
        }
        
        
        // 5.url
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        // 6.准备参数
        let parameters = ["uid" : uid]
        
        // 7.发送请求
        requestGET(urlString, parameters: parameters, finished: finished)
        
//        afnManager.GET(urlString, parameters: parameters, progress: nil, success: { (_, result) -> Void in
//            // 8.调用闭包
//            finished(result: result as? [String:AnyObject], error: nil)
//            }) { (_, error) -> Void in
//            finished(result: nil, error: error)
//        }
    }
    
    
    // MARK: - 加载微博数据
    func loadStatuses(finished:(rusult : [String : AnyObject]?,error:NSError?) -> ()) {
        
//        guard let access_token = HYLUserAccountViewModel.sharedInstance.userAccout?.access_token else {
//            // 方式3: 将NSError的创建也封装到枚举里面
//            let error = HYLNetworkToolError.AccessTokenEmpty.error()
//            finished(rusult: nil, error: error)
//            return
//        }
        
        // https://api.weibo.com/2/statuses/home_timeline.json?access_token=2.00r2rM6G0WU16Fb5f29ab78dzaEq1B
        
        
        let url = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        requestGET(url, parameters: nil,finished: finished)
        
//       let parameters = ["access_token" : access_token]
        
//        afnManager.GET(url, parameters: parameters, progress: nil, success: { (_, result) -> Void in
//            // print("_____________\(access_token)")
//            finished(rusult: result as? [String : AnyObject], error: nil)
//            }) { (_, error) -> Void in
//                finished(rusult: nil, error: error)
//        }

    }
    
    
    // 定义闭包
    typealias finishedCallBack = (rusult : [String : AnyObject]?,error:NSError?) -> ()
    // 现在所有的请求都是直接调用AFN的GET请求,如果有一天,AFN改了参数,或者项目改为其它网络框架,那么我们调用AFN.GET的地方都需要改动,将AFN.GET进行抽取
    
    func requestGET(urlString:String? , var parameters : [String:AnyObject]? , finished: finishedCallBack){
        
        guard let access_token = HYLUserAccountViewModel.sharedInstance.userAccout?.access_token else {
            // 方式3: 将NSError的创建也封装到枚举里面
            let error = HYLNetworkToolError.AccessTokenEmpty.error()
            finished(rusult: nil, error: error)
            return
        }
        
        // 当别人没有传入请求参数,创建请求参数
        if parameters == nil {
            parameters = [String: AnyObject]()
        }

        // 给参数拼接access_token,添加 ["access_token": access_token]
        parameters!["access_token"] = access_token
        
        // 7.发送请求
        afnManager.GET(urlString!, parameters: parameters, progress: nil, success: { (_, result) -> Void in
        // 8.调用闭包
             finished(rusult: result as? [String:AnyObject], error: nil)
        }) { (_, error) -> Void in
             finished(rusult: nil, error: error)
        }
        
    }
    
}







